package com.ltcode.auth.domain.model;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

/**
 * 认证用户领域模型
 * 
 * @author ltcode
 * @since 2024-01-01
 */
@Data
public class AuthUser implements Serializable {
    
    private static final long serialVersionUID = 1L;

    /** 用户ID */
    private Long id;

    /** 用户名 */
    private String username;

    /** 昵称 */
    private String nickName;

    /** 用户类型 */
    private String userType;

    /** 邮箱 */
    private String email;

    /** 手机号码 */
    private String phoneNumber;

    /** 性别 */
    private String sex;

    /** 头像 */
    private String avatar;

    /** 密码 */
    private String password;

    /** 状态（0正常 1停用） */
    private String status;

    /** 删除标志（0代表存在 2代表删除） */
    private String delFlag;

    /** 最后登录IP */
    private String loginIp;

    /** 最后登录时间 */
    private Date loginDate;

    /** 密码最后更新时间 */
    private Date pwdUpdateDate;

    /** 创建时间 */
    private Date createTime;

    /** 更新时间 */
    private Date updateTime;

    /** 备注 */
    private String remark;

    /** 部门ID */
    private Long deptId;

    /** 部门名称 */
    private String deptName;

    /** 权限列表 */
    private Set<String> permissions;

    /** 角色列表 */
    private Set<String> roles;

    /**
     * 是否为管理员
     */
    public boolean isAdmin() {
        return isAdmin(this.id);
    }

    public static boolean isAdmin(Long userId) {
        return userId != null && 1L == userId;
    }

    /**
     * 是否正常状态
     */
    public boolean isNormal() {
        return "0".equals(status);
    }

    /**
     * 是否已删除
     */
    public boolean isDeleted() {
        return "2".equals(delFlag);
    }

    /**
     * 是否停用
     */
    public boolean isDisabled() {
        return "1".equals(status);
    }


    /**
     * 更新登录信息
     */
    public void updateLoginInfo(String loginIp) {
        this.loginIp = loginIp;
        this.loginDate = new Date();
    }

    /**
     * 检查用户是否可以登录
     */
    public void checkCanLogin() {
        if (isDeleted()) {
            throw new RuntimeException("用户已被删除，无法登录");
        }
        if (isDisabled()) {
            throw new RuntimeException("用户已被停用，无法登录");
        }
    }
}
